From: Florian Müllner Date: Tue, 26 Oct 2021 17:40:08 +0000 (+0200) Subject: dbusServices/extensions: Only allow one dialog at a time X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~536^2^2~103 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=b93342f72e871dc8472a9e92b23b45e0e7ded282;p=gnome-shell.git dbusServices/extensions: Only allow one dialog at a time Showing multiple preference dialogs at the same time (for instance by repeated `gnome-extensions prefs` calls) may or may not work as expected, depending on whether any of the dialogs is modal or not (read: opened via the Extensions app). The easiest way to address this is to disallow more than a single dialog at the time. It's arguably also the more predictable behavior, and means extensions don't have to deal with inconsistent state caused by multiple dialogs. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4564 Part-of: --- diff --git a/js/dbusServices/extensions/extensionsService.js b/js/dbusServices/extensions/extensionsService.js index 7fa32fe80..10743d4cc 100644 --- a/js/dbusServices/extensions/extensionsService.js +++ b/js/dbusServices/extensions/extensionsService.js @@ -116,30 +116,37 @@ var ExtensionsService = class extends ServiceImplementation { if (this._handleError(invocation, error)) return; + if (this._prefsDialog) { + this._handleError(invocation, + new Error('Already showing a prefs dialog')); + return; + } + const [serialized] = res; const extension = ExtensionUtils.deserializeExtension(serialized); - const window = new ExtensionPrefsDialog(extension); - window.connect('realize', () => { + this._prefsDialog = new ExtensionPrefsDialog(extension); + this._prefsDialog.connect('realize', () => { let externalWindow = null; if (parentWindow) externalWindow = Shew.ExternalWindow.new_from_handle(parentWindow); if (externalWindow) - externalWindow.set_parent_of(window.get_surface()); + externalWindow.set_parent_of(this._prefsDialog.get_surface()); }); if (options.modal) - window.modal = options.modal.get_boolean(); + this._prefsDialog.modal = options.modal.get_boolean(); - window.connect('close-request', () => { + this._prefsDialog.connect('close-request', () => { + delete this._prefsDialog; this.release(); return false; }); this.hold(); - window.show(); + this._prefsDialog.show(); invocation.return_value(null); });